﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using EFDataModel;
using EFDataModel.Enums;

namespace ContactManagement.AppCode.HtmlHelperForViews
{
    /// <summary>
    /// HTML Helpersklasse die speziell für das Arbeiten mit den Kategorien gemacht wurde, damit die Gesamtübersicht
    /// der HTML Helpers nicht zu unübersichtlich wird, view "spezifische" HTML Helpers erstellen.
    /// http://weblogs.asp.net/rashid/archive/2009/04/03/asp-net-mvc-best-practices-part-2.aspx
    /// </summary>
    public class CategoriesHtmlHelper
    {
        #region Member
        private readonly HtmlHelper CurrentHtmlHelper;
        #endregion

        #region Konstruktor
        /// <summary>
        /// Konstruktor der HTML Helpers Klasse für die Kategorien. die Statische Klasse zum Instanzieieren findet man in den HtmlHelperExtensions
        /// </summary>
        public CategoriesHtmlHelper(HtmlHelper htmlHelper)
        {
            CurrentHtmlHelper = htmlHelper;
        }
        #endregion

        #region Public Functions
        /// <summary>
        /// Gibt den passenden Seitentitel zurück um welche Kategorie es sich gerade handelt.
        /// </summary>
        /// <returns>String mit dem Passenden Seitenttitel</returns>
        public string GetCategoriesPageTitle()
        {
            //die aktuelle Action wird nur bei einigen helpern benötigt
            EActionAdministration eAction = (EActionAdministration)Enum.Parse(typeof(EActionAdministration), CurrentHtmlHelper.ViewContext.RouteData.GetRequiredString(WebConstants.ActionString));

            //Prüfen um welcher Kategorie es sich handelt die angezeigt werden soll, damit der richtige Text angezeigt werden kann
            if (CurrentHtmlHelper.ViewContext.RouteData.Values.ContainsValue(EFCategoryTypes.UserCategory.ToString()))
            {
                switch (eAction)
                {
                    case EActionAdministration.CategoriesList:
                        return App_GlobalResources.PageTitles.UserCategoriesRESX;

                    case EActionAdministration.CategoriesEdit:
                        return App_GlobalResources.PageTitles.UserCategoryRESX;

                    case EActionAdministration.CategoriesAdd:
                        return App_GlobalResources.PageTitles.UserCategoryRESX;

                        //Delete ist nicht vorhanden als extra Seite, daher auch kein Extra Page Titel.
                }
            }

            //Prüfen um welcher Kategorie es sich handelt die angezeigt werden soll, damit der richtige Text angezeigt werden kann
            if (CurrentHtmlHelper.ViewContext.RouteData.Values.ContainsValue(EFCategoryTypes.UserGroups.ToString()))
            {
                switch (eAction)
                {
                    case EActionAdministration.CategoriesList:
                        return App_GlobalResources.PageTitles.UserGroupsRESX;

                    case EActionAdministration.CategoriesEdit:
                        return App_GlobalResources.PageTitles.UserGroupRESX;

                    case EActionAdministration.CategoriesAdd:
                        return App_GlobalResources.PageTitles.UserGroupRESX;
                }
            }

            //Prüfen um welcher Kategorie es sich handelt die angezeigt werden soll, damit der richtige Text angezeigt werden kann
            if (CurrentHtmlHelper.ViewContext.RouteData.Values.ContainsValue(EFCategoryTypes.UserRights.ToString()))
            {
                switch (eAction)
                {
                    case EActionAdministration.CategoriesList:
                        return App_GlobalResources.PageTitles.UserRightsRESX;
                }
            }

            //Prüfen um welcher Kategorie es sich handelt die angezeigt werden soll, damit der richtige Text angezeigt werden kann
            if (CurrentHtmlHelper.ViewContext.RouteData.Values.ContainsValue(EFCategoryTypes.DynamicDataTypeCategory.ToString()))
            {
                switch (eAction)
                {
                    case EActionAdministration.CategoriesList:
                        return App_GlobalResources.PageTitles.DynamicDataTypeCategoriesRESX;

                    case EActionAdministration.CategoriesAdd:
                    case EActionAdministration.CategoriesEdit:
                        return App_GlobalResources.PageTitles.DynamichDataTypeCategoryRESX;
                }
            }

            //Dann wurde für diese Kategorie noch kein Wert festgelegt!
            return App_GlobalResources.GlobalStrings.ValueNotSetRESX;
        }

        /// <summary>
        /// Gibt den passenden Elementitel zurück z.b. bearbeiten, anlegen
        /// </summary>
        /// <returns>String mit dem Passenden Elementitel</returns>
        public string GetCategoriesElementTitle()
        {
            //die aktuelle Action wird nur bei einigen helpern benötigt
            EActionAdministration eAction = (EActionAdministration)Enum.Parse(typeof(EActionAdministration), CurrentHtmlHelper.ViewContext.RouteData.GetRequiredString(WebConstants.ActionString));

            //Bei der Anzeige des Titels wird überall das gleiche angezeigt.
            switch (eAction)
            {
                case EActionAdministration.CategoriesList:
                    return App_GlobalResources.PageTitles.ListRESX;

                case EActionAdministration.CategoriesEdit:
                    return App_GlobalResources.PageTitles.EditRESX;

                case EActionAdministration.CategoriesAdd:
                    return App_GlobalResources.PageTitles.AddRESX;
            }

            //Dann wurde für diese Kategorie noch kein Wert festgelegt!
            return App_GlobalResources.GlobalStrings.ValueNotSetRESX;

        }

        /// <summary>
        /// Erstellt einen Link mit dem man zum Bearbeitenformular für eine Usergroup kommt.
        /// Auf der Seite kann man dann der Gruppe Nutzer zuordnen bzw. wieder entfernen.
        /// </summary>
        /// <returns>Link to UserGroupAddUserFormular</returns>
        public MvcHtmlString CreateUserGroupsEditLink(long groupId)
        {
             //Wenn es sich bei der aktuellen Anzeige um die UserGroups handelt, nur dann wird der Link erstellt.
            if (CurrentHtmlHelper.ViewContext.RouteData.Values.ContainsValue(EFCategoryTypes.UserGroups.ToString()))
            {
                //Link erstellen der das Bearbieten der Gruppenmitglieder ermöglicht
                //BeispielLink: /Administration/Categories/UserGroups/UserGroupsAddUser/23
                string htmlGroupEditUsers = string.Format(" | <a href=\"/{0}/Categories/{1}/{2}/{3}\">{4}</a>", EControllers.Administration.ToString(), EFCategoryTypes.UserGroups.ToString(),
                                            EActionAdministration.UserGroupsShowUsers.ToString(), groupId, App_GlobalResources.Navigation.ArrangeUsersToGroupRESX);

                //Link erstellen der das Bearbeiten der Gruppenrechte ermöglicht, bzw. erst einmal auf die Seite verweißt mit den Gruppenrechten
                string htmlGroupEditRights = string.Format(" | <a href=\"/{0}/Categories/{1}/{2}/{3}\">{4}</a>", EControllers.Administration.ToString(), EFCategoryTypes.UserGroups.ToString(),
                                            EActionAdministration.UserGroupsShowRights.ToString(), groupId, App_GlobalResources.Navigation.EditUserRightsRESX);

                return MvcHtmlString.Create(htmlGroupEditUsers + htmlGroupEditRights);
            }

            //Sonst wird ein Leerer String zurück gegeben
            return MvcHtmlString.Empty;
        }

        /// <summary>
        /// Gibt den String mit dem richtigen Namen der übergebenen Kategorie ID zurück, gilt für alle Objekte die von EFCategorie ableiten
        /// </summary>
        /// <param name="categoryId">CategoryId zu der der Name herausgesucht werden soll.</param>
        /// <returns>String mit dem Name der Kategorie</returns>
        public string DisplayForCategory(string categoryId)
        {
            long catId = long.Parse(categoryId);
            //die passende Kategorie aus der DB laden
            var category = CurrentHttpContext.GetDataModel().EFCategoryMenge.Find(catId);

            if (category != null)
            {
                //Den Namen der Kategorie zurück geben
                return category.Name;
            }

            return App_GlobalResources.GlobalStrings.ValueNotSetRESX;
        }
        #endregion
    }
}